package cn.wyz.system.service.impl;

import cn.wyz.basic.service.impl.BaseServiceImpl;
import cn.wyz.system.domain.Menu;
import cn.wyz.system.mapper.MenuMapper;
import cn.wyz.system.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author WuyuZ
 * @since 2022-06-22
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {
    @Autowired
    private MenuMapper menuMapper;


    @Override
    public List<Menu> queryTree() {
        List<Menu> menus = menuMapper.selectAll();
        Map<Long, Menu> allMenus = new HashMap<>();
        for (Menu menu : menus) {
            allMenus.put(menu.getId(),menu);
        }
        //顶级菜单
        List<Menu> firstCurseType = new ArrayList<>();
        for (Menu tempMenu : menus) {
            //如果没有上级菜单,即为顶级菜单
            if(tempMenu.getParentId() == null){
                firstCurseType.add(tempMenu);
            }//如果不是顶级,那么就在这个循环中去找到自己的上级菜单,然后存入上级的children封装字段中
            else{
                /*
                3.1 allMenus最先声明的是一个map,该map的key值是Long类型的,在t_menu表中,每条数据的parent_id就是与自身的id关联的
                所以这里直接用 allMenus.get(Long)来获取到对应的存入map的menu对象,这些就是当前遍历的tempMenu部门对象的上级部门
                 */
                Menu parentMenu = allMenus.get(tempMenu.getParentId());
                if(parentMenu != null){
                    /*3.2 children字段是一个集合,不能直接set,要不然又要遍历,直接拿到集合用add的方式
                        就在这个循环中把由上级部门的子级存入对应的上级
                     */
                    parentMenu.getChildren().add(tempMenu);
                }
            }
        }//3.3 我们只需要从最上级开始拿,子级会自动在循环中通过查询map的key来存入对应上级部门的children集合中
        return firstCurseType;
    }
}
